class Solution {
public:
    TreeNode* _sortedArrayToBST(int begin,int end,vector<int>& nums)
    {
        if(begin==end)
        {
            return nullptr;
        }//不正常的区间，因为这个函数的目的是将nums中从begin到end-1位置的值都转变成为二叉搜索树，但是现在begin和end相等的时候
        //区间就已经不是一个正常的区间了，自然要返回nullptr
        int mid = (begin+end)/2;
        return new TreeNode(nums[mid],_sortedArrayToBST(begin,mid,nums),_sortedArrayToBST(mid+1,end,nums));; 
        //最后使用中间值构建一个节点，这个节点的左子树和右子树继续交给这个函数处理
    }//这个函数的功能就是将nums从begin到end-1位置的值都转变一棵平衡二叉树
    TreeNode* sortedArrayToBST(vector<int>& nums) 
    {
        //这里为了构建出一棵平衡二叉树首先选择nums中中间的一个点作为根节点，将整个数组分成两个部分
        //然后下面的子问题就是要将我左半部分的节点变为一棵平衡二叉树，以及将我右半部分的节点也变成一棵平衡二叉树
        //怎么做呢？选择作伴部分的中间点作为左子树的根节点。此时就找到了子问题。
        int n = nums.size();
        return _sortedArrayToBST(0,n,nums);
    }
};